package com.hhl.service;

import java.util.concurrent.CountDownLatch;

import org.I0Itec.zkclient.IZkDataListener;

public class ZookeeperDistrbuteLock extends ZookeeperAbstractLock {
	private CountDownLatch countDownLatch = null;

	@Override
	boolean tryLock() {
		try {
			zkClient.createEphemeral(PATH);
			return true;
		} catch (Exception e) {
			// 如果失败 直接catch
			return false;
		}

	}

	@Override
	void waitLock() {
		IZkDataListener izkDataListener = new IZkDataListener() {
			// 节点被删除
			public void handleDataDeleted(String path) throws Exception {
				// 唤醒被等待的线程
				if (countDownLatch != null) {
					countDownLatch.countDown(); // 计数器为0的情况，await 后面的继续执行
				}
			}
			// 节点被修改
			public void handleDataChange(String path, Object data) throws Exception {

			}
		};
		// 监听事件通知       注册节点信息
		zkClient.subscribeDataChanges(PATH, izkDataListener);
		 // 控制程序的等待
		if (zkClient.exists(PATH)) {//如果 检查出 已经被创建了 就new 然后进行等待
			// 创建信号量
			countDownLatch = new CountDownLatch(1);
			try {
				countDownLatch.await();//等待时候 就不往下走了   当为0 时候 后面的继续执行
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		 //后面代码继续执行
        //为了不影响程序的执行 建议删除该事件监听 监听完了就删除掉
		zkClient.unsubscribeDataChanges(PATH, izkDataListener);
	}

}
